/**
 * 将 extension 的原型挂载到 proto 的原型上
 * @param extension 扩展类，继承自 proto
 * @param proto 基类
 * @example
 * // 原来的类
 * class Original {
 *     foo() { return 1; }
 * }
 * // 拓展类
 * class Extension extends Original {
 *     bar() { return 2; }
 *     stuff_get() { return 3; }
 * }
 * // 挂载拓展
 * assignPrototype(Extension, Original);
 * // 挂在成功，可以使用：
 * const obj = new Original;
 * obj.foo();   // 1 - 原始类的方法
 * obj.bar();   // 2 - 扩展上去的方法
 * obj.stuff;   // 3 - 扩展上去的 getter
 */
export function assignPrototype(extension: Record<string, any>, proto: Record<string, any>) {
    Object.getOwnPropertyNames(extension.prototype).forEach(key => {
        if (key.includes('_get')) {
            Object.defineProperty(proto.prototype, key.split('_get')[0], {
                get: extension.prototype[key],
                enumerable: false,
                configurable: true
            });
        }
        else {
            proto.prototype[key] = extension.prototype[key];
        }
    });
}